//萌趣星球游戏
//main.h在Project/inc目录下
#include "../inc/main.h"

//编译指令：arm-linux-g++ -std=c++11 *.cpp -o main libfont.a -lm -pthread
//发送指令：cp main /home/wgp/nfs_se/

/*
    开发板大小：800*480
    触摸屏大小：800*480
    触摸屏坐标范围：x:0-800 y:0-480
    大纲：
    进入先显示主页图片
        1.显示主页图片
        2.点击start进入到选择登录界面
            start按钮：左上角:300&180 右下角：480&250
    选择登录界面
        1.游客登录: 300,250 & 480,290
            1.1直接进入游戏选择界面
            1.2游客模式不记录分数
        2.用户登录: 300,345 & 480,400
            2.1账号界面: 账号按钮 340,45 & 520,85   密码按钮 340,130 & 520,170  注册: 245,180 & 325,230  登录:440,190 ,520,225
            2.2账号界面: 键盘输入框 x:0,y:240
            2.3用户记录游戏分数
        3.返回检测: 700,0 & 800,60
    
    点击触摸屏后，显示游戏选择界面
        1.显示游戏名称：井字棋  位置：57,193 242,393
        2.显示游戏名称：2048    位置：285,195 469,393
        3.显示游戏名称：贪吃坤  位置：512,195 700,393
            贪吃坤游戏实现：
                1.显示贪吃坤游戏界面
                2.显示贪吃蛇地图
                3.显示贪吃蛇
                4.触摸屏控制贪吃蛇移动
                    4.1吃到自己或撞墙
                        4.1.1：打印游戏结束图片：左中心位置
                        4.1.2：判断本局是否是历史最高分
                        4.1.3：选择是否重新开始
                5.触摸屏点击返回游戏选择界面
        4.返回检测: 700,0 & 800,60
*/  



int main()
{
    char main_text[50];

    //用于返回游戏选择标识类
    ReturnInterfaceFlag flag;
    flag.interfaceFlag = 0;//界面路径标志
    flag.userLoginFlag = false;//用户登录标志

    //创建ShowFont对象,打印文字
    ShowFont* main_showFont = ShowFont::instance();

    //创建BMP对象,读取图片数据
    BMP boot("./mainInterface/boot.bmp");
    BMP gameOption("./mainInterface/gameOption.bmp");
    BMP logininterface("./mainInterface/loginInterface.bmp");
    BMP musicContinue("./mainInterface/musicContinue.bmp");
    BMP musicPause("./mainInterface/musicPause.bmp");//音乐播放暂停
    BMP snakeRanking("./mainInterface/snakeRanking.bmp");
    BMP _2048Ranking("./mainInterface/2048Ranking.bmp");

    // 创建播放视频播放器实例
    VideoPlayer player("/bin/mplayer");  // 指定 mplayer 路径
    player.play("./mainInterface/boot.avi");
    sleep(11);  // 播放11秒后，停止播放
    player.stop();// 停止播放视频

    // 创建滑动检测器实例，获取触摸事件坐标
    SwipeDetector detector;
    while (1)
    {   
        switch (flag.interfaceFlag)
        {
            case 0:
                // 开机界面: 界面路径标志:0  点击start进入到选择登陆界面
                while (1)
                {
                    // 显示主页图片
                    boot.show(Lcd::instance()->addr(), 0, 0);
                    
                    // 等待触摸事件
                    detector.detectSwipe();

                    std::cout<<"x = "<<detector.getX()<<" "<<"y = "<<detector.getY()<<std::endl;
                    // 触摸屏坐标范围
                    if (detector.getX() >= 300 && detector.getX() <= 480 && detector.getY() >= 180 && detector.getY() <= 250)
                    {
                        flag.interfaceFlag = 1; //选择登录界面
                        break;
                    }
                    else
                    {
                        std::cout << "Invalid touch coordinates." << std::endl;
                    }
                }
                break;
            case 1:
                // 选择登录界面: 界面路径标志:1  选择游客登录或者用户登录(用户登录可以登录管理员账号)  游客登录直接跳到游戏选择界面 返回回到开机界面
                while (1)
                {
                    // 显示登录界面
                    logininterface.show(Lcd::instance()->addr(), 0, 0);

                    detector.detectSwipe();
                    // 触摸屏坐标范围
                    if (detector.getX() >= 300 && detector.getX() <= 480 && detector.getY() >= 245 && detector.getY() <= 300)
                    {
                        flag.interfaceFlag = 3; //游客登录
                        break;
                    }
                    else if (detector.getX() >= 300 && detector.getX() <= 480 && detector.getY() >= 345 && detector.getY() <= 400)
                    {
                        flag.interfaceFlag = 2; //用户登录
                        break;
                    }
                    else if (detector.getX() >= 700 && detector.getX() <= 800 && detector.getY() >= 0 && detector.getY() <= 60)
                    {
                        flag.interfaceFlag = 0; //返回开机界面
                        break;
                    }
                    else
                    {
                        std::cout << "Invalid touch coordinates." << std::endl;
                    }
                }                
                
                break;
            case 2:
                // 用户登录界面: 界面标志:2 点击账号或者密码进行输入 输入账号密码后点击注册或者登录
                flag.UserName =getKeyFromCoordinates();
                // 判断用户名是否为空,如果是则返回登录界面，否则进入游戏选择界面
                if (flag.UserName == "")
                {
                    cout<<"用户名不能为空"<<endl;
                    flag.interfaceFlag = 1; //返回登录界面
                }
                else
                {
                    cout<<"用户名："<<flag.UserName<<endl;
                    flag.interfaceFlag = 3;//进入游戏选择界面
                    flag.userLoginFlag = true;//用户登录
                }
                detector.resetTouchState();//清除触摸事件坐标
                break;
            case 3:
                // 游戏选择界面:界面标志3,进入到该界面时,会在正中下位置(290,400)显示(欢迎,某某用户) 用户可选择对应游戏进行玩
                gameOption.show(Lcd::instance()->addr(), 0, 0);// 显示游戏选择界面
                detector.resetTouchState();// 重置触摸状态
                while (1)
                {
                    // 如果是用户登录，显示欢迎用户文字
                    if (flag.userLoginFlag)
                    {
                        sprintf(main_text, "欢迎用户：%s", flag.UserName.c_str());//flag.UserName为用户名
                        main_showFont->display(main_text, 32, 200, 32, ShowFont::purple, ShowFont::white, 300, 440);
                    }

                    detector.detectSwipe();
                    // 触摸屏坐标范围
                    if (detector.getX() >= 57 && detector.getX() <= 242 && detector.getY() >= 193 && detector.getY() <= 393)
                    {
                        flag.interfaceFlag = 4; //井字棋游戏
                        break;
                    }
                    else if (detector.getX() >= 285 && detector.getX() <= 469 && detector.getY() >= 195 && detector.getY() <= 393)
                    {
                        flag.interfaceFlag = 5; //2048游戏
                        break;
                    }
                    else if (detector.getX() >= 512 && detector.getX() <= 700 && detector.getY() >= 195 && detector.getY() <= 393)
                    {
                        flag.interfaceFlag = 6; //贪吃坤游戏
                        break;
                    }
                    else if (detector.getX() >= 630 && detector.getX() <= 720 && detector.getY() >= 100 && detector.getY() <= 195)
                    {
                        //默认显示snake游戏排行榜
                        snakeRanking.show(Lcd::instance()->addr(), 0, 0);
                        UserManager::getInstance().displayLeaderboard("Snake"); // 通过单例显示排行榜
                        while (1)
                        {
                            detector.detectSwipe();
                            if (detector.getX() >= 25 && detector.getX() <= 95 && detector.getY() >= 225 && detector.getY() <= 295)
                            {
                                //显示snake排行榜
                                snakeRanking.show(Lcd::instance()->addr(), 0, 0);
                                UserManager::getInstance().displayLeaderboard("Snake"); // 通过单例显示排行榜
                            }
                            else if (detector.getX() >= 705 && detector.getX() <= 770 && detector.getY() >= 225 && detector.getY() <= 295)
                            {
                                //显示2048排行榜
                                _2048Ranking.show(Lcd::instance()->addr(), 0, 0);
                                UserManager::getInstance().displayLeaderboard("2048"); // 通过单例显示排行榜
                            }
                            else if (detector.getX() >= 700 && detector.getX() <= 800 && detector.getY() >= 0 && detector.getY() <= 60)
                            {
                                gameOption.show(Lcd::instance()->addr(), 0, 0);// 显示游戏选择界面
                                break;//返回游戏选择界面
                            }
                        }
                    }
                    else if (detector.getX() >= 700 && detector.getX() <= 800 && detector.getY() >= 0 && detector.getY() <= 60)
                    {
                        flag.interfaceFlag = 1; //返回登录界面
                        flag.UserName.clear();//清空用户名
                        flag.userLoginFlag = false;//退出用户登录状态
                        break;
                    }
                    else
                    {
                        std::cout << "游戏选择界面,无效位置" << std::endl;
                    }
                }
                break;
            case 4:
                // 井字棋游戏: 界面路径标志:4  选择游戏后,会显示井字棋游戏界面,用户可进行游戏
                Game ticTacToe;
                ticTacToe.ticTacToe(flag.UserName, flag.userLoginFlag);
                detector.resetTouchState();//清除触摸事件坐标

                flag.interfaceFlag = 3;// 返回游戏选择界面
                break;
            case 5:
                // 2048游戏： 界面路径标志:5  选择游戏后,会显示2048游戏界面,用户可进行游戏
                Game game;
                game._2048Play(flag.UserName, flag.userLoginFlag);
                detector.resetTouchState();//清除触摸事件坐标
                flag.interfaceFlag = 3;// 返回游戏选择界面
                break;
            case 6:
                // 贪吃坤游戏：界面路径标志:6  选择游戏后,会显示贪吃坤游戏界面,用户可进行游戏
                Game snake;
                snake.snakePlay(flag.UserName, flag.userLoginFlag);
                detector.resetTouchState();//清除触摸事件坐标
                
                flag.interfaceFlag = 3;// 返回游戏选择界面
                break;
            default:
                break;
        }

    }

    return 0;
}

